'''
You have an array of numbers.
Your task is to sort ascending odd numbers but even numbers must be on their places.

Zero isn't an odd number and you don't need to move it. If you have an empty array, you need to return it.

Example

sort_array([5, 3, 2, 8, 1, 4]) == [1, 3, 2, 8, 5, 4]
'''
# 方案一：
# def sort_array(source_array):
#     # Return a sorted array.
#     if source_array :
#         odd_array = []
#         for i in source_array :
#             if i % 2 == 1:
#                 odd_array.append(i)
#         odd_array.sort(reverse=True)
        
#         for i in  range(len(source_array)):
#             if source_array[i] % 2 == 1:
#                 source_array[i] = odd_array.pop()
        
#     return source_array


# 方案二：
def sort_array(arr):
    odds = sorted((x for x in arr if x%2 != 0), reverse=True)
    return [x if x%2==0 else odds.pop() for x in arr]
'''
分析：
  1、方案二用到了生成器 () 和 列表生成式 [] 
  2、用到了内置函数 sorted()
  列表生成式可以直接创建一个你需要的列表，但是会将列表的值全部存储到内存中
  如果使用生成器，则会减少内存的占用，现取现用。使用这两种方式取决于你如何使用接下来的数据
'''


# 方案三：
def sort_array(source_array):
    odds = iter(sorted(v for v in source_array if v % 2))
    return [next(odds) if i % 2 else i for i in source_array]

# 方案四：
from collections import deque

def sort_array(array):
    odd = deque(sorted(x for x in array if x % 2))
    return [odd.popleft() if x % 2 else x for x in array]